#ifndef UART_COMM_H
#define UART_COMM_H

#include "stm32f4xx_hal.h"     // STM32 HAL库
#include "cmsis_os.h"          // RTOS接口
#include <stdbool.h>            // 布尔类型支持

// ==================== 系统参数配置 ====================
#define LORA_ADDR_SIZE        3       // LoRa地址长度(字节)
#define MAX_RX_BUF_SIZE       256     // 接收缓冲区大小
#define MAX_TX_BUF_SIZE       256     // 发送缓冲区大小
#define TX_POOL_SIZE          8       // 发送帧池大小
#define RX_QUEUE_SIZE         8       // 接收队列容量
#define TX_QUEUE_SIZE         8       // 发送队列容量
#define FREE_FRAME_QUEUE_SIZE TX_POOL_SIZE // 空闲帧队列容量
#define FRAME_ACQUIRE_TIMEOUT 100     // 获取帧超时(ms)

// 增强帧格式: [AA][55][源ID][长度L][长度H][数据...][0D][0A]
#define FRAME_START_MARKER_1  0xAA    // 帧起始标志1
#define FRAME_START_MARKER_2  0x55    // 帧起始标志2
#define FRAME_END_MARKER_CR   0x0D    // 帧结束符(回车)
#define FRAME_END_MARKER_LF   0x0A    // 帧结束符(换行)
#define FRAME_HEADER_SIZE     5       // 帧头大小(字节)
#define FRAME_FOOTER_SIZE     2       // 帧尾大小(字节)

// 辅助宏定义
#define MIN(a, b) ((a) < (b) ? (a) : (b)) // 取最小值

// ==================== 数据结构定义 ====================

/**
 * @brief 数据帧结构
 * - data:         指向实际数据缓冲区
 * - length:       有效数据长度
 * - is_locked:    锁定状态(使用中)
 * - source_id:    源标识(任务ID)
 * - add_lora:     是否添加LoRa地址
 * - last_sent_time: 最后发送时间戳
 */
typedef struct {
    uint8_t* data;
    uint16_t length;
    bool is_locked;
    uint8_t source_id;
    bool add_lora;
    uint32_t last_sent_time;
} DataFrame_t;

/**
 * @brief UART资源管理结构
 * - huart:        UART句柄
 * - hdma_rx:       接收DMA句柄
 * - hdma_tx:       发送DMA句柄
 * - rx_frames[2]: 双接收缓冲区
 * - current_rx_index: 当前接收缓冲区索引
 * - rx_queue:     接收数据队列
 * - tx_queue:     发送数据队列
 * - tx_task_handle: 发送任务句柄
 * - tx_in_progress: 发送进行中标志
 */
typedef struct {
    // 硬件资源
    UART_HandleTypeDef* huart;
    DMA_HandleTypeDef* hdma_rx;
    DMA_HandleTypeDef* hdma_tx;
    
    // 接收管理
    DataFrame_t rx_frames[2];   // 双缓冲
    uint8_t current_rx_index;   // 当前接收缓冲索引
    
    // 任务通信
    osMessageQueueId_t rx_queue; // 接收队列
    osMessageQueueId_t tx_queue; // 发送队列
	
	osSemaphoreId_t tx_sem;  // 新增发送完成信号量
    
    // 发送控制
    osThreadId_t tx_task_handle; // 发送任务句柄
    volatile bool tx_in_progress; // 发送状态标志
	
} UART_Resource_t;

// ==================== 全局资源声明 ====================
extern UART_Resource_t usart1_resource; // USART1资源管理
extern UART_Resource_t usart3_resource; // USART3资源管理
extern osMessageQueueId_t free_frame_queue; // 空闲帧队列

// ==================== 初始化函数 ====================
void UARTCOM_InitBuffers(void); // 初始化缓冲池
void UARTCOM_InitUARTResource(UART_Resource_t* resource); // 初始化UART资源

// ==================== 帧管理API ====================
DataFrame_t* UARTCOM_AcquireTxFrame(uint32_t timeout); // 获取发送帧
void UARTCOM_ReleaseTxFrame(DataFrame_t* frame);       // 释放发送帧

// ==================== 通信接口 ====================
void UARTCOM_SendToUART(const char* msg, UART_Resource_t* resource, bool add_lora, uint8_t source_id); // 发送消息

// ==================== 任务函数 ====================
void UARTCOM_ReceiveTask(void* argument);   // 接收任务
void UARTCOM_TransmitTask(void* argument);  // 发送任务

// ==================== HAL回调处理 ====================
void UARTCOM_ProcessIdleCallback(UART_HandleTypeDef* huart);      // 空闲中断处理
void UARTCOM_ProcessErrorCallback(UART_HandleTypeDef* huart);     // 错误中断处理
void UARTCOM_ProcessTxCompleteCallback(UART_HandleTypeDef* huart); // 发送完成处理

#endif /* UART_COMM_H */

